<!DOCTYPE html>
<html>
<head>
  <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SpawnTask.js"></script>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<script type="text/javascript">
const Cc = SpecialPowers.Cc;
const Ci = SpecialPowers.Ci;
const Cu = SpecialPowers.Cu;

const {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", {});

const HELPERAPP_DIALOG_CID =
        SpecialPowers.wrap(SpecialPowers.Components)
        .ID(Cc["@mozilla.org/helperapplauncherdialog;1"].number);
const HELPERAPP_DIALOG_CONTRACT_ID = "@mozilla.org/helperapplauncherdialog;1";
const MOCK_HELPERAPP_DIALOG_CID =
        SpecialPowers.wrap(SpecialPowers.Components)
        .ID("{391832c8-5232-4676-b838-cc8ad373f3d8}");

var registrar = SpecialPowers.wrap(Components).manager
                .QueryInterface(Ci.nsIComponentRegistrar);

var helperAppDlgPromise = new Promise(function(resolve) {
  var mockHelperAppService;

  function HelperAppLauncherDialog() {
  }

  HelperAppLauncherDialog.prototype = {
    show: function(aLauncher, aWindowContext, aReason) {
      ok(true, "Whether showing Dialog");
      resolve();
      registrar.unregisterFactory(MOCK_HELPERAPP_DIALOG_CID,
                                  mockHelperAppService);
    },
    QueryInterface: XPCOMUtils.generateQI([Ci.nsIHelperAppLauncherDialog])
  };

  mockHelperAppService = XPCOMUtils._getFactory(HelperAppLauncherDialog);
  registrar.registerFactory(MOCK_HELPERAPP_DIALOG_CID, "",
                            HELPERAPP_DIALOG_CONTRACT_ID,
                            mockHelperAppService);
});

add_task(function*() {
  let promise = new Promise(function(resolve) {
    let iframe = document.createElement("iframe");
    iframe.onload = function() {
      is(iframe.contentDocument.getElementById("edit").innerText, "abc",
         "load iframe source");
      resolve();
    };
    iframe.id = "testframe";
    iframe.src = "data:text/html,<div id=edit contenteditable=true>abc</div>";
    document.body.appendChild(iframe);
  });

  yield promise;

  let iframe = document.getElementById("testframe");
  let docShell = SpecialPowers.wrap(iframe.contentWindow)
                 .QueryInterface(Ci.nsIInterfaceRequestor)
                 .getInterface(Ci.nsIWebNavigation)
                 .QueryInterface(Ci.nsIDocShell);

  ok(docShell.hasEditingSession, "Should have editing session");

  document.getElementById("testframe").src =
    "data:application/octet-stream,TESTCONTENT";

  yield helperAppDlgPromise;

  ok(docShell.hasEditingSession, "Should have editing session");
});
</script>
</body>
</html>
